package com.joysuch.wwyt.workflow.service.impl;

import com.joysuch.wwyt.core.common.ajax.ResultBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateQueryBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateTypeBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateTypeTreeBean;
import com.joysuch.wwyt.workflow.entity.WorkFlowFormTemplate;
import com.joysuch.wwyt.workflow.entity.WorkFlowFormTemplateType;
import com.joysuch.wwyt.workflow.repository.WorkFlowFormTemplateDao;
import com.joysuch.wwyt.workflow.repository.WorkFlowFormTemplateTypeDao;
import com.joysuch.wwyt.workflow.service.WorkFlowFormTemplateTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class WorkFlowFormTemplateTypeServiceImpl implements WorkFlowFormTemplateTypeService {

    @Autowired
    private WorkFlowFormTemplateTypeDao formTemplateTypeDao;

    @Autowired
    private WorkFlowFormTemplateDao flowFormTemplateDao;

    @Override
    public ResultBean save(WorkFlowFormTemplateTypeBean bean) {
        WorkFlowFormTemplateType formTemplateType = null;
        if(bean.getId() == null || bean.getId() ==0){
            formTemplateType = new WorkFlowFormTemplateType();
            formTemplateType.setState(1);
            if(checkDuplicateName(bean, true)){
              return ResultBean.wrapErrorResultDefault("类型名称已经存在，不能重复");
            }
        }else{
            formTemplateType = findById(bean.getId());
            if(formTemplateType == null){
                return ResultBean.wrapErrorResultDefault("当前的表单模板已不存在，无法保存。");
            }
            if(checkDuplicateName(bean, false)){
                return ResultBean.wrapErrorResultDefault("类型名称已经存在，不能重复");
            }
        }
        BeanUtils.copyProperties(bean, formTemplateType);
        formTemplateTypeDao.save(formTemplateType);
        return ResultBean.success(formTemplateType);
    }

    private boolean checkDuplicateName(WorkFlowFormTemplateTypeBean bean, boolean isNew){
        boolean result  = false;
        WorkFlowFormTemplateType formTemplateType = formTemplateTypeDao.findFirstByNameAndParentId(bean.getName(),bean.getParentId());
        if(isNew){
           if(formTemplateType != null){
               return true;
           }
        }else{
            if(formTemplateType != null && bean.getId()!= formTemplateType.getId()){
                return true;
            }
        }
        return result;
    }

    @Override
    public ResultBean delete(Long id) {
        Integer count  = flowFormTemplateDao.findCountByType(id);
        if(count != null && count >0 ){
            return ResultBean.wrapErrorResultDefault("当前类型尚有绑定的表单模板，请先解除绑定关系后再删除。");
        }
        formTemplateTypeDao.deleteById(id);
        return ResultBean.defaultSuccessResult();
    }

    @Override
    public WorkFlowFormTemplateType findById(Long id) {
        WorkFlowFormTemplateType formTemplateType =  formTemplateTypeDao.findById(id).orElse(null);
        if(formTemplateType!= null && formTemplateType.getParentId() != null){
            WorkFlowFormTemplateType parent = formTemplateTypeDao.findById(formTemplateType.getParentId()).orElse(null);
            if(parent!= null){
                formTemplateType.setParentName(parent.getName());
            }
        }
        return formTemplateType;
    }

    @Override
    public List<WorkFlowFormTemplateType> findAll(){
        return formTemplateTypeDao.findAllByStateOrderByParentIdAscShowOrderAsc(1);
    }


    @Override
    public List<WorkFlowFormTemplateTypeTreeBean> listTree(){
        List<WorkFlowFormTemplateTypeTreeBean> list = new ArrayList<>();
        List<WorkFlowFormTemplateType> all = findAll();
        if(all != null && !all.isEmpty()){
            Map<Long, WorkFlowFormTemplateTypeTreeBean> treeMap = new HashMap<>();
            for(WorkFlowFormTemplateType type: all) {
                WorkFlowFormTemplateTypeTreeBean bean = new WorkFlowFormTemplateTypeTreeBean();
                bean.setId(type.getId());
                bean.setLabel(type.getName());
                bean.setChildren(new ArrayList<>());
                treeMap.put(type.getId(), bean);
                if(type.getParentId() == null || type.getParentId()==0){
                    list.add(bean);
                }else{

                    WorkFlowFormTemplateTypeTreeBean parent= treeMap.get(type.getParentId());
                    parent.getChildren().add(bean);
                    treeMap.put(parent.getId(), parent);
                }
            }

        }
        return  list;
    }
}
